package com.hdy;

//代码自动生成器

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.po.TableFill;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;

import java.util.ArrayList;

/**
 * AutoGenerator 是 MyBatis-Plus 的代码生成器
 * 通过 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller等各个模块的代码，极大的提升了开发效率。
 */
public class HdyCode {
    public static void main(String[] args) {    //快捷键：psvm
        // 首先要构建一个 代码自动生成器 对象
        AutoGenerator autoGenerator = new AutoGenerator();

        // 配置策略
        // 1、配置全局策略
        GlobalConfig config = new GlobalConfig();// GlobalConfig 一定要是MyBatisPlus下gennerator下的包
        //获取系统当前目录
        String projectPath = System.getProperty("user.dir");//获取用户的目录
        config.setOutputDir(projectPath+"/src/main/java");  //输出目录
        //设置作者
        config.setAuthor("大大怪将军");
        //是否打开资源管理器
        config.setOpen(false);
        //是否需要覆盖原来生成的文件
        config.setFileOverride(false);
        //设置服务的名字
        config.setServiceName("%sService");      //通过正则表达式去掉服务名前面的 "I" 前缀
        //设置Id生成策略
        config.setIdType(IdType.ID_WORKER);     //使用默认全局唯一id的生成策略
        //设置日期的类型
        config.setDateType(DateType.ONLY_DATE); //日期时间的类型使用仅仅只是时间
        //是否自动配置Swagger文档
        config.setSwagger2(true);

        //将全局配置放到自动生成器里面
        autoGenerator.setGlobalConfig(config);      //将全局配置config放入到自动生成器autoGenerator中

        // 2、设置数据源配置
        DataSourceConfig dataSourceConfig = new DataSourceConfig();
        //设置数据库连接地址URL
        dataSourceConfig.setUrl("jdbc:mysql://192.168.163.128:3306/" +
                "mybatis_plus?" +               //数据库名
                "useSSL=true&" +                //是否使用SSL安全连接
                "useUnicode=true&" +            //是否使用统一字符编码
                "characterEncoding=utf-8&" +    //设置字符编码
                "serverTimezone=GMT%2B8"        //设置时区
        );
        dataSourceConfig.setDriverName("com.mysql.cj.jdbc.Driver");     //设置数据库驱动名
        dataSourceConfig.setUsername("root");                           //设置数据库连接名
        dataSourceConfig.setPassword("root");                           //设置数据库登录密码
        dataSourceConfig.setDbType(DbType.MYSQL);                       //设置数据库类型为Mysql

        //将数据源配置 dataSourceConfig 放入到自动生成器 autoGenerator 中
        autoGenerator.setDataSource(dataSourceConfig);

        // 3、包的配置
        PackageConfig packageConfig = new PackageConfig();      //创建包以及对象的配置
        packageConfig.setEntity("blog");             // 设置模块的名字
        packageConfig.setParent("com.hdy");          // 设置存放的包路径
        packageConfig.setEntity("pojo");             // 设置实体类的名字
        packageConfig.setMapper("mapper");           // 设置持久层的名字
        packageConfig.setService("service");         // 设置service层的名字
        packageConfig.setController("controller");   // 设置控制层的名字

        //将包配置 packageConfig 放到自动生成器 autoGenerator 中
        autoGenerator.setPackageInfo(packageConfig);

        // 4、策略配置
        StrategyConfig strategyConfig = new StrategyConfig();
        strategyConfig.setInclude("user");        //设置映射数据库所包含的表名，参数：table1,table2....
        strategyConfig.setNaming(NamingStrategy.underline_to_camel);  //设置包命名规则  下划线转驼峰
        strategyConfig.setColumnNaming(NamingStrategy.underline_to_camel);  //设置列名命名规则
        strategyConfig.setEntityLombokModel(true);      //是否使用 lombok 开启注解，自动加上lombok注解

        strategyConfig.setLogicDeleteFieldName("deleted");  //开启逻辑删除策略，参数为表的逻辑删除字段名

        //自动填充策略
        TableFill gmtCreate = new TableFill("gmt_create", FieldFill.INSERT);           //自动填充创建时间
        TableFill gmtUpdate = new TableFill("gmt_update", FieldFill.INSERT_UPDATE);    //自动填充修改时间

        //将策略配置添加到自动生成器中
        ArrayList<TableFill> tableFills = new ArrayList<>();  //创建ArrayList<> 将自动填充策略添加到ArrayList中
        tableFills.add(gmtCreate);
        tableFills.add(gmtUpdate);
        strategyConfig.setTableFillList(tableFills);        //将ArrayList中保存的策略添加到策略配置 strategyConfig 中

        //乐观锁策略
        strategyConfig.setVersionFieldName("version");      //设置乐观锁名字

        strategyConfig.setRestControllerStyle(true);        //开启驼峰命名模式
        strategyConfig.setControllerMappingHyphenStyle(true);   //开启控制层下滑线模式   响应请求方式//localhost:8080/hello_id_2

        //将所有的策略配置 strategyConfig 都放到自动生成器 autoGenerator 中
        autoGenerator.setStrategy(strategyConfig);




        autoGenerator.execute();    //执行代代码自动生成器
    }
}
